// 加载环境变量（必须在所有其他require之前）
require('dotenv').config();

const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const helmet = require('helmet');
const morgan = require('morgan');
const compression = require('compression');
const rateLimit = require('express-rate-limit');
const swaggerUi = require('swagger-ui-express');
const swaggerJsdoc = require('swagger-jsdoc');
const path = require('path');

const app = express();
const port = process.env.PORT || 3001;

// 导入API路由
const apiRoutes = require('./src/routes');

// 基础中间件
app.use(helmet()); // 安全头
app.use(compression()); // 响应压缩
app.use(morgan('dev')); // 日志
app.use(cors()); // 跨域支持
app.use(bodyParser.json()); // JSON解析
app.use(bodyParser.urlencoded({ extended: true })); // URL编码解析

// 限流中间件
const apiLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15分钟
  max: 100, // 每个IP限制100个请求
  standardHeaders: true,
  legacyHeaders: false,
});

// 应用限流
app.use('/api/', apiLimiter);

// Swagger文档配置
const swaggerOptions = {
  definition: {
    openapi: '3.0.0',
    info: {
      title: '数独游戏API',
      version: '1.0.0',
      description: '数独游戏微信小程序的API文档',
    },
    servers: [
      {
        url: `http://localhost:${port}`,
        description: '开发服务器',
      },
    ],
  },
  apis: ['./src/routes/*.js'], // 路由文件路径
};

const swaggerSpec = swaggerJsdoc(swaggerOptions);

// Swagger文档路由
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));

// 静态文件
app.use(express.static(path.join(__dirname, 'public')));

// 注册API路由
app.use('/', apiRoutes);

// 启动服务器
app.listen(port, () => {
  console.log(`服务器运行在 http://localhost:${port}`);
  console.log(`API文档: http://localhost:${port}/api-docs`);
});

module.exports = app;
